﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace AR.Controls
{
    [TemplateVisualState(Name = ExtendedComboBox.StateNormal, GroupName = ExtendedComboBox.GroupItemsSource)]
    [TemplateVisualState(Name = ExtendedComboBox.StateNotSelected, GroupName = ExtendedComboBox.GroupItemsSource)]
    [TemplateVisualState(Name = ExtendedComboBox.StateEmpty, GroupName = ExtendedComboBox.GroupItemsSource)]
    public class ExtendedComboBox : ComboBox
    {
        public const string GroupItemsSource = "ItemsSourceStates";
        public const string StateNormal = "Normal";
        public const string StateNotSelected = "NotSelected";
        public const string StateEmpty = "Empty";

        private ContentPresenter selectedContent;

        public ExtendedComboBox()
        {
            this.DefaultStyleKey = typeof(ComboBox);
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            this.selectedContent = this.GetTemplateChild("ContentPresenter") as ContentPresenter;

            // This event can change the NotSelected state
            this.SelectionChanged += (s, e) => this.SetTextIfEmpty();

            // Set a state at start
            this.SetTextIfEmpty();
        }

        // This method can change the Empty state
        protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            base.OnItemsChanged(e);
            this.SetTextIfEmpty();
        }

        /// <summary>
        /// Text if the SelectedItem property is null.
        /// </summary>
        public string NotSelectedText
        {
            get { return (string)GetValue(NotSelectedTextProperty); }
            set { SetValue(NotSelectedTextProperty, value); }
        }

        public static readonly DependencyProperty NotSelectedTextProperty =
            DependencyProperty.Register("NotSelectedText", typeof(string), typeof(ExtendedComboBox), new PropertyMetadata(" "));

        /// <summary>
        /// Text if there are no items in the ComboBox at all.
        /// </summary>
        public string EmptyText
        {
            get { return (string)GetValue(EmptyTextProperty); }
            set { SetValue(EmptyTextProperty, value); }
        }

        public static readonly DependencyProperty EmptyTextProperty =
            DependencyProperty.Register("EmptyText", typeof(string), typeof(ExtendedComboBox), new PropertyMetadata(null));

        /// <summary>
        /// Changes the state of this control and updates the displayed text.
        /// </summary>
        protected void SetTextIfEmpty()
        {
            if (this.selectedContent == null || !(this.selectedContent.Content is TextBlock))
                return;
            var text = this.selectedContent.Content as TextBlock;

            if (this.SelectedItem == null && this.Items != null && this.Items.Count > 0)
            {
                text.Text = this.NotSelectedText;
                VisualStateManager.GoToState(this, ExtendedComboBox.StateNotSelected, true);
            }
            else if (this.SelectedItem == null)
            {
                text.Text = this.EmptyText ?? this.NotSelectedText;
                VisualStateManager.GoToState(this, ExtendedComboBox.StateEmpty, true);
            }
            else VisualStateManager.GoToState(this, ExtendedComboBox.StateNormal, true);
        }
    }
}
